//! Ispis pojedinacnih znakova u video memoriju

#define _ARH_ISPIS_C_
#include "ispis.h"

#include <jezgra/razno.h>
#include "vj_sucelje.h"

/* X pozicija kursora */
static int xpoz;
/* Y pozicija kursora */
static int ypoz;
/* Pocetak video memorije. */
static unsigned char *video;

static void arh_postavi_poziciju (int x, int y)
{
	unsigned short int t;
	xpoz = x;
	ypoz = y;
	t = ypoz * 80 + xpoz;
	outb(0x3D4, 14);
	outb(0x3D5, t >> 8);
	outb(0x3D4, 15);
	outb(0x3D5, t & 0xFF);
}

void arh_ispis_inicijaliziraj ()
{
	arh_obrisi_zaslon();
}

void arh_obrisi_zaslon (void)
{
	int i;
	
	video = (unsigned char *) VIDEO;
	
	for (i = 0; i < STUPACA * REDAKA * 2; i++)
		*(video + i) = 0;

	arh_postavi_poziciju(0, 0);
}

void arh_ispisi_znak_arh (int c)
{
	arh_ispisi_znak_a(c, ARH_ATRIBUT);
}

void arh_ispisi_znak_j (int c)
{
	arh_ispisi_znak_a(c, J_ATRIBUT);
}

void arh_ispisi_znak (int c)
{
	arh_ispisi_znak_a(c, ATRIBUT);
}

void arh_ispisi_znak_a (int c, int atribut)
{
	switch (c) {
	case '\t':
		xpoz = (xpoz / 8 + 1) * 8;
		break;
	case '\r':
		xpoz = 0;
	case '\n':
		break;
	default:
		*(video + (xpoz + ypoz * STUPACA) * 2) = c & 0x00FF;
		*(video + (xpoz + ypoz * STUPACA) * 2 + 1) = atribut;
		xpoz++;
	}
	
	if (xpoz >= STUPACA || c == '\n') {
		xpoz = 0;
		if (ypoz < REDAKA)
			ypoz++;
		else {
			memmove(video, video+80*2, 80*2*24);
			memsetw(video + 80*2*24, ' ' | (ATRIBUT << 8), 80);
		}
	}

	arh_postavi_poziciju(xpoz, ypoz);
}

void arh_ispisi_rijec (char *rijec)
{
	int i;
	
	if (rijec == (void *) 0)
		return;
	
	for (i = 0; rijec[i] != '\0'; i++)
		arh_ispisi_znak_arh(rijec[i]);
}
